home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / misc / sci / ephem_src_4_28.lha / io_amiga.c < prev    next >
C/C++ Source or Header  |  1992-06-21  |  8KB  |  394 lines

  1. /*
  2.  * amiga_io.c
  3.  *
  4.  * I/O Interface module for Ephem Amiga port
  5.  *
  6.  * Written by Timo Rossi <trossi@jyu.fi> 1992-05-24
  7.  *
  8.  */
  9.  
  10. #include <exec/types.h>
  11. #include <intuition/intuition.h>
  12. #include <devices/console.h>
  13. #include <workbench/workbench.h>
  14. #include <workbench/startup.h>
  15.  
  16. #include <clib/exec_protos.h>
  17. #include <clib/intuition_protos.h>
  18. #include <clib/dos_protos.h>
  19. #include <clib/icon_protos.h>
  20.  
  21. #ifdef __SASC
  22. extern struct ExecBase *SysBase;
  23. extern struct DosLibrary *DOSBase;
  24. #include <pragmas/exec_pragmas.h>
  25. #include <pragmas/intuition_pragmas.h>
  26. #include <pragmas/dos_pragmas.h>
  27. #include <pragmas/icon_pragmas.h>
  28. #include <time.h>
  29. extern char *_TZ;
  30. #endif
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <stdarg.h>
  35. #include <string.h>
  36.  
  37. #include "screen.h"
  38.  
  39. extern struct MsgPort *CreatePort(int, int);
  40. extern void DeletePort(struct MsgPort *);
  41. extern struct IORequest *CreateExtIO(struct MsgPort *, int);
  42. extern void DeleteExtIO(struct IORequest *);
  43.  
  44. char *wgetenv(char *);
  45.  
  46. extern struct WBStartup *WBenchMsg;
  47.  
  48. struct Library *IconBase = NULL;
  49. struct DiskObject *ProgIcon = NULL;
  50. struct IntuitionBase *IntuitionBase = NULL;
  51. struct MsgPort *ConWrPort = NULL;
  52. struct MsgPort *ConRdPort = NULL;
  53. struct IOStdReq *ConWrReq = NULL;
  54. struct IOStdReq *ConRdReq = NULL;
  55. struct Device *ConsoleDevice = NULL;
  56. struct Window *Window = NULL;
  57. struct Screen *Screen = NULL;
  58. UBYTE RdChar = 0;
  59.  
  60. #define STR1(x) #x
  61. #define STR(x) STR1(x)
  62.  
  63. #define SCR_HEIGHT 204
  64. #define TOP_OFFSET 12
  65.  
  66. /*
  67.  * Remember to update version number here
  68.  */
  69. char Screen_Title[] = "Ephem 4.28";
  70.  
  71. struct TextAttr Topaz80 = {
  72.   "topaz.font",
  73.   8,
  74.   FS_NORMAL,
  75.   FPF_ROMFONT
  76. };
  77.  
  78. struct NewScreen NewS = {
  79.   0, 0, 640, SCR_HEIGHT, 2,    /* left, top, width, height, depth */
  80.   0, 1,            /* detailpen, blockpen */
  81.   HIRES,        /* viewmodes */
  82.   CUSTOMSCREEN,        /* type */
  83.   &Topaz80,        /* font */
  84.   Screen_Title,        /* title */
  85.   NULL,            /* gadgets (not used) */
  86.   NULL            /* custombitmap */
  87. };
  88.  
  89. struct NewWindow NewW = {
  90.   0, 0, 640, SCR_HEIGHT,        /* left, top, width, height */
  91.   -1, -1,            /* detailpen & blockpen from screen */
  92.   NULL,                /* No IDCMP, all input via console.device */
  93.   BACKDROP|BORDERLESS|ACTIVATE|SMART_REFRESH|NOCAREREFRESH,    /* flags */
  94.   NULL,            /* firstGadget */
  95.   NULL,            /* checkmark */
  96.   NULL,            /* title */
  97.   NULL,            /* screen (filled in runtime) */
  98.   NULL,            /* bitmap */
  99.   0, 0, 0, 0,        /* sizing limits */
  100.   CUSTOMSCREEN        /* screen type */
  101. };
  102.  
  103. int CleanupAmiga(void)
  104. {
  105.   if(ConsoleDevice)
  106.       {
  107.     AbortIO(ConRdReq);
  108.     WaitIO(ConRdReq);
  109.     CloseDevice(ConWrReq);
  110.       }
  111.   if(ConRdReq) DeleteExtIO(ConRdReq);
  112.   if(ConWrReq) DeleteExtIO(ConWrReq);
  113.   if(ConRdPort) DeletePort(ConRdPort);
  114.   if(ConWrPort) DeletePort(ConWrPort);
  115.   if(Window) CloseWindow(Window);
  116.   if(Screen) CloseScreen(Screen);
  117.  
  118.   if(ProgIcon) FreeDiskObject(ProgIcon);
  119.   if(IconBase) CloseLibrary(IconBase);
  120.   if(IntuitionBase) CloseLibrary(IntuitionBase);
  121.  
  122.   return 0;
  123. }
  124.  
  125. void ErrorExit(char *msg)
  126. {
  127.   fprintf(stderr, "%s\n", msg);
  128.   exit(10);
  129. }
  130.  
  131. void InitAmiga(void)
  132. {
  133.   char *tzname;
  134.  
  135.   onexit(CleanupAmiga);
  136.  
  137.   if((IntuitionBase = OpenLibrary("intuition.library", 0)) == NULL)
  138.     ErrorExit("No IntuitionLib!");
  139.  
  140.   if((Screen = OpenScreen(&NewS)) == NULL)
  141.     ErrorExit("Can't open screen!");
  142.  
  143.   NewW.Screen = Screen;
  144.  
  145.   if((Window = OpenWindow(&NewW)) == NULL)
  146.     ErrorExit("Can't open window!");
  147.  
  148.   if((ConRdPort = CreatePort(0, 0)) == NULL
  149.      || (ConWrPort = CreatePort(0, 0)) == NULL)
  150.     ErrorExit("Can't create MsgPorts!");
  151.  
  152.   if((ConRdReq = (struct IOStdReq *)
  153.      CreateExtIO(ConRdPort, sizeof(struct IOStdReq))) == NULL
  154.       || (ConWrReq = (struct IOStdReq *)
  155.        CreateExtIO(ConWrPort, sizeof(struct IOStdReq))) == NULL)
  156.     ErrorExit("Can't create IORequests!");
  157.  
  158.   ConWrReq->io_Data = (APTR)Window;
  159.  
  160.   if(OpenDevice("console.device", 0, ConWrReq, 0) != 0)
  161.     ErrorExit("Can't open console device!");
  162.  
  163.   ConsoleDevice = ConRdReq->io_Device = ConWrReq->io_Device;
  164.   ConRdReq->io_Unit = ConWrReq->io_Unit;
  165.   ConRdReq->io_Command = CMD_READ;
  166.   ConRdReq->io_Data = (APTR)&RdChar;
  167.   ConRdReq->io_Length = 1;
  168.   SendIO(ConRdReq);
  169.  
  170. #ifdef __SASC
  171.   if((tzname = wgetenv("TZ")) == NULL)
  172.     tzname = "UTC-00";
  173.  
  174.   _TZ = tzname;
  175.   tzset();
  176. #endif
  177. }
  178.  
  179. /*
  180.  * Write a NUL-terminated string to console.device
  181.  */
  182. void ConWrite(struct IOStdReq *req, char *str)
  183. {
  184.   ConWrReq->io_Command = CMD_WRITE;
  185.   ConWrReq->io_Data = (APTR)str;
  186.   ConWrReq->io_Length = -1;
  187.   DoIO(ConWrReq);
  188. }
  189.  
  190. /*
  191.  * Read a character from console.device
  192.  *
  193.  * This assumes that the given IORequest has already been sent
  194.  * to console.device with command CMD_READ
  195.  *
  196.  */
  197. int ConReadCh(struct IOStdReq *req)
  198. {
  199.   int c;
  200.   WaitIO(req);
  201.  
  202.   c = *((UBYTE *)req->io_Data);
  203.  
  204.   SendIO(req);
  205.   return c;
  206. }
  207.  
  208. /*
  209.  * Move cursor to row, col
  210.  */
  211. void c_pos(int r, int c)
  212. {
  213.   static char buf[16];
  214.  
  215.   sprintf(buf, "\233%d;%dH", r, c);
  216.   ConWrite(ConWrReq, buf);
  217. }
  218.  
  219. /*
  220.  * Erase entire screen
  221.  */
  222. void c_erase(void)
  223. {
  224.   if(ConsoleDevice == NULL)
  225.     InitAmiga();
  226.  
  227. /* clear screen, set top offset, disable scroll, cursor home */
  228.   ConWrite(ConWrReq, "\233H" "\2332J" "\233" STR(TOP_OFFSET) "y" "\233>1l");
  229. }
  230.  
  231. /*
  232.  * Erase to end of line
  233.  */
  234. void c_eol(void)
  235. {
  236.   ConWrite(ConWrReq, "\233K");
  237. }
  238.  
  239. int chk_char(void)
  240. {
  241.   return (CheckIO(ConRdReq) ? 0 : -1);
  242. }
  243.  
  244. int read_char(void)
  245. {
  246.   int c;
  247.  
  248.   c = ConReadCh(ConRdReq);
  249.   if(c == 155) /* '\233' doesn't work! */
  250.      {
  251.     c = ConReadCh(ConRdReq);
  252.     switch(c)
  253.       {
  254.          case 'A':
  255.         return 'k';    /* up */
  256.  
  257.          case 'B':
  258.         return 'j';    /* down */
  259.  
  260.          case 'C':
  261.         return 'l';    /* right */
  262.  
  263.          case 'D':
  264.         return 'h';    /* left */
  265.  
  266.          default:
  267.             while(c <= '9') c = ConReadCh(ConRdReq);
  268.         return c;
  269.       }
  270.      }
  271.   return c;
  272. }
  273.  
  274. /*
  275.  * TTY cleanup, not needed here
  276.  */
  277. void byetty(void)
  278. {
  279. }
  280.  
  281. /*
  282.  * write a string to the console
  283.  */
  284. void cwrite(char *str)
  285. {
  286.   ConWrite(ConWrReq, str);
  287. }
  288.  
  289. /*
  290.  * write a character to the console
  291.  */
  292. void cputchar(int c)
  293. {
  294.   char bb[2];
  295.  
  296.   bb[0] = c;
  297.   bb[1] = '\0';
  298.   ConWrite(ConWrReq, bb);
  299. }
  300.  
  301. #ifdef __SASC
  302. /*
  303.  * SAS/C 5.10 does not have sleep()
  304.  */
  305. void sleep(int n)
  306. {
  307.   if(n) Delay(50 * n);
  308. }
  309. #endif
  310.  
  311. /*
  312.  * This is from original io.c, with small modifications
  313.  */
  314.  
  315. /* read up to max chars into buf, with cannonization.
  316.  * add trailing '\0' (buf is really max+1 chars long).
  317.  * return count of chars read (not counting '\0').
  318.  * assume cursor is already positioned as desired.
  319.  * if type END when n==0 then return -1.
  320.  */
  321. read_line (buf, max)
  322. char buf[];
  323. int max;
  324. {
  325.     static char erase[] = "\b \b";
  326.     int n, c;
  327.     int done;
  328.  
  329. #ifdef UNIX
  330.     if (!ttysetup) setuptty();
  331. #endif
  332.  
  333.     for (done = 0, n = 0; !done; )
  334.         switch (c = read_char()) {    /* does not echo */
  335.         case cntrl('h'):    /* backspace or */
  336.         case 0177:        /* delete are each char erase */
  337.         if (n > 0) {
  338.             cwrite(erase);
  339.             n -= 1;
  340.         }
  341.         break;
  342.         case cntrl('u'):        /* line erase */
  343.         while (n > 0) {
  344.             cwrite(erase);
  345.             n -= 1;
  346.         }
  347.         break;
  348.         case '\r':    /* EOL */
  349.         done++;
  350.         break;
  351.         default:            /* echo and store, if ok */
  352.         if (n == 0 && c == END)
  353.             return (-1);
  354.         if (n >= max)
  355.             cputchar (cntrl('g'));
  356.         else if (c >= ' ') {
  357.             cputchar (c);
  358.             buf[n++] = c;
  359.         }
  360.         }
  361.  
  362.     buf[n] = '\0';
  363.     return (n);
  364. }
  365.  
  366. /*
  367.  * getenv that also searches tooltypes if the program was started from WB
  368.  *
  369.  */
  370. char *wgetenv(char *name)
  371. {
  372.   BPTR lock;
  373.   char *s;
  374.  
  375.   if(WBenchMsg)
  376.      {
  377.     if(IconBase == NULL)
  378.         {
  379.            if((IconBase = OpenLibrary("icon.library", 0)) == NULL)
  380.           goto do_getenv;
  381.         }
  382.     lock = CurrentDir(WBenchMsg->sm_ArgList[0].wa_Lock);
  383.     ProgIcon = GetDiskObject(WBenchMsg->sm_ArgList[0].wa_Name);
  384.     CurrentDir(lock);
  385.     if(ProgIcon)
  386.        {
  387.           if((s = FindToolType(ProgIcon->do_ToolTypes, name)) != NULL)
  388.          return s;
  389.        }
  390.      }
  391. do_getenv:
  392.   return getenv(name);
  393. }
  394.